[AWS] Auto Scaling Based on a Schedule
AutoScaling は時間が掛かる?
Auto Scaling はポーリングで動くため、実際にスケールされるまで時間が掛かります。
また、CloudWatch を組み合わせたり、ELB を使っている場合、データ収集やヘルスチェックについてもポーリングで動くため、実際にアクセス可能になるまで時間が掛かってしまいます。
事前に予測できる負荷の場合、Auto Scaling では、予めスケジュールを指定して負荷に対応することができます。
※過去にほぼ同じ内容のエントリがありますが、今回 aws cli 版で試したので執筆することにしました。。
https://dev.classmethod.jp/cloud/auto-scaling-schedule/
手順
前提
以下が事前に設定済みとします。
- AWS Command Line Interface(http://aws.amazon.com/jp/cli/)のインストール
- アクセスキーとシークレットアクセスキー、及びリージョンが環境変数の指定
- スケール時に起動する元の AMI の作成
LaunchConfiguration と AutoScalingGroup の作成
下記を実行し、Launch Configuration を作成します。
$ aws autoscaling create-launch-configuration \ --launch-configuration-name my-test-lc \ --image-id ami-8bce5cb1 \ --instance-type t1.micro \ --key-name scale-test-key
--image-idに AMI の ID を指定します。
次に、上記の Launch Configuration を指定して、AutoScalingGroup を作成します。
$ aws autoscaling create-auto-scaling-group \ --auto-scaling-group-name my-test-asg \ --launch-configuration-name my-test-lc \ --min-size 2 \ --max-size 2 \ --desired-capacity 2 \ --availability-zones "ap-northeast-1a" "ap-northeast-1b" --tags '{ "key": "Name", "value": "scale test"}'
実行すると、--desired-capacity の数だけインスタンスが起動されます。
上記を行ったら、マネージメントコンソールを開き、インスタンスが起動していることを確認してみましょう。
指定した数分起動していますね。
指定日時にスケールアウトさせる
指定日時にアクションを行うためには、put-scheduled-update-group-action コマンドを使用します。
日時の指定 start_time は、 UTC/GMT で指定します。
下記のコマンドは、指定日時に3台にスケールアウトさせます。
$ aws autoscaling put-scheduled-update-group-action \ --auto-scaling-group-name my-test-asg \ --scheduled-action-name ScaleOut \ --start-time "2013-07-30T09:00:00Z" \ --desired-capacity 3 \ --max-size 3
--max-size には、--desired-capacity と同じ値かそれより大きい値を指定します。
マネージメントコンソールを開いて、指定日時にスケールアウトされることを確認します。
スケールアウトされましたね。
指定日時にスケールインさせる
スケールインについても、スケールアウトとコマンドは同じです。
下記のコマンドで、指定日時に1台にスケールインさせます。
$ aws autoscaling put-scheduled-update-group-action \ --auto-scaling-group-name my-test-asg \ --scheduled-action-name ScaleIn \ --start-time "2013-07-30T11:00:00Z" \ --desired-capacity 1 \ --min-size 1 --max-size 2
--min-size には、--desired-capacity と同じ値かそれより小さい値を指定します。
マネージメントコンソールを開いて、指定日時にスケールインされることを確認します。
スケールインされましたね。
cron 形式でも記述可能
ちなみに、上記のスケジュールのアクションは以下のように --recurrence オプションを使って、cron形式でも指定可能です。
$ aws autoscaling put-scheduled-update-group-action \ --auto-scaling-group-name my-test-asg \ --scheduled-action-name ScaleIn \ --recurrence “30 0 1 1,6,12 0”\ --desired-capacity 1 \ --min-size 1
後片付け
update-auto-scaling-group で --min-size、--max-size を 0 にして、インスタンスを落とします。
$ aws autoscaling update-auto-scaling-group \ --auto-scaling-group-name my-test-asg \ --min-size 0 \ --max-size 0
describe-auto-scaling-instances で、起動しているインスタンスを確認し、結果がなくなるまで実行します。
$ aws autoscaling describe-auto-scaling-instances []
紐づくインスタンスがすべて Terminate されたら、AutoScalingGroup を削除します。
$ aws autoscaling delete-auto-scaling-group \ --auto-scaling-group-name my-test-asg
最後に LaunchConfiguration を削除します。
$ aws autoscaling delete-launch-configuration \ --launch-configuration-name my-test-lc
まとめ
テレビ紹介などで事前にアクセス増加が分かってる場合は、スケジューリングによって対応した方が望ましいですね。
スケーリングには時間がかかるので、それを加味してスケジューリングすることが重要です。
ちなみに、CloudFormation ではまだサポートしていないようでした。。